package com.jdk.study.d2jvm.chapter05;

import java.util.Date;

/**
 * @description:
 * @author: JackLi
 * @date: 2020/4/12 17:14
 */
public class Stack05_LocalVariableTest {

    private int count = 0;

    public static void main(String[] args) {
        Stack05_LocalVariableTest localVariableTest = new Stack05_LocalVariableTest();
        int num = 10;
        localVariableTest.test1();
    }

    // 练习
    public static void testStatic() {
        Stack05_LocalVariableTest test = new Stack05_LocalVariableTest();
        Date date = new Date();
        int count = 10;
        System.out.println(count);
        // 报错：因为 this 变量不存在于当前方法的局部变量边中！
//        System.out.println(this.count);
    }

    /*
        ----------------------关于 Slot 使用的理解--------------------------
     */

    public Stack05_LocalVariableTest() {
        this.count = 1;
    }

    private void test1() {
        Date date = new Date();
        String name1 = "lishuai.com";
        String info = test2(date, name1);
        System.out.println(date + name1);
    }

    private String test2(Date dateP, String name2) {
        dateP = null;
        name2 = "songhongkang";
        double weight = 130.5;  // 占据2个 Slot
        char gender = '男';
        return dateP + name2;
    }

    public void test3() {
        count++;
    }

    public void test4() {
        int a = 0;
        {
            int b = 0;
            b = a + 1;
        }
        // 变量 c 使用之前已经销毁的变量 b 占据的slot的位置
        int c = a + 1;
    }

    /*
        知识点：变量的分类
            按照数据类型分：（1）基本数据类型；（2）引用数据类型
            按照在类中声明的位置分：（1）成员变量：在使用前都经历过默认初始化赋值
                                    类变量：在类加载子系统中的linking环节的prepare阶段，给类变量默认赋值 --> 在initialization环节给类变量显示赋值，即静态代码块赋值
                                    实例变量：随着对象的创建，会在堆空间中分配实例变量空间，并进行默认赋值
                               （2）局部变量：在使用前必须要进行显示赋值的，否则编译不通过。


     */
    public void test5Temp() {
        int num;
//        System.out.println(num);    // 报错：变量num未进行初始化 (Variable 'num' might not have been initialized)
    }

}
